/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package Persistencia;

/**
 *
 * @author RafaelGutierrez
 */
import cprincipal.Doctor;
import cprincipal.Persona;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import org.jdom.output.XMLOutputter;

public class DoctorXml {

    private Element root;
    private String fileLocation = "src/Archivos/doctores.xml";

    public DoctorXml() {
        try {
            SAXBuilder builder = new SAXBuilder(false);
            Document doc = null;
            doc = builder.build(fileLocation);
            root = doc.getRootElement();
        } catch (JDOMException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        } catch (IOException ex) {
            System.out.println("No se pudo iniciar la operacion por: " + ex.getMessage());
        }
    }

    private Element DoctortoXmlElement(Doctor nDoctor) {
        Element Doctortrans = new Element("doctor");

            Element nombre = new Element("nombre");
                nombre.setText(nDoctor.getNombre());

            Element apellido = new Element("apellido");
                apellido.setText(nDoctor.getApellido());

            Element cedula = new Element("cedula");
                cedula.setText(Integer.toString(nDoctor.getCedula()));

            Element anionac = new Element("anionac");
                anionac.setText(nDoctor.getAnionac());

            Element localidad = new Element("localidad");
                localidad.setText(nDoctor.getLocalidad());

            Element telefono = new Element("telefono");
                telefono.setText(nDoctor.getTelefono());

            Element direccion = new Element("direccion");
                direccion.setText(nDoctor.getDireccion());

            Element numerocolegiatura = new Element("numerocolegiatura");
                numerocolegiatura.setText(nDoctor.getNumerocolegitura());

            Element universidadegreso = new Element("universidadegreso");
                universidadegreso.setText(nDoctor.getUniversidadegreso());

            Element estudioespeciales = new Element ("estudioespeciales");
                estudioespeciales.setText(nDoctor.getEstudioespeciales());

            Element especialidad = new Element ("especialidad");
                especialidad.setText(nDoctor.getEspecialidad());

            Element anioexperiencia = new Element ("anioExperiencia");
                anioexperiencia.setText(Integer.toString(nDoctor.getAnioexperiencia()));

            Element disponible = new Element ("disponible");
                disponible.setText(nDoctor.getDisponible());

            Element horaentrada = new Element ("horaentrada");
                horaentrada.setText(nDoctor.getHoraentrada());

            Element horasalida = new Element ("horasalida");
                horasalida.setText(nDoctor.getHorasalida());

            Element infraestructura = new Element ("infraestructura");
                infraestructura.setText(nDoctor.getInfraestructura());

           

        Doctortrans.addContent(nombre);
        Doctortrans.addContent(apellido);
        Doctortrans.addContent(cedula);
        Doctortrans.addContent(anionac);
        Doctortrans.addContent(localidad);
        Doctortrans.addContent(telefono);
        Doctortrans.addContent(direccion);
        Doctortrans.addContent(numerocolegiatura);
        Doctortrans.addContent(universidadegreso);
        Doctortrans.addContent(estudioespeciales);
        Doctortrans.addContent(especialidad);
        Doctortrans.addContent(anioexperiencia);
        Doctortrans.addContent(disponible);
        Doctortrans.addContent(horaentrada);
        Doctortrans.addContent(horasalida);
        Doctortrans.addContent(infraestructura);
        

        return Doctortrans;
    }

    /*Método que retorna un Estudiante. A este metodo se le manda un Element y con
    sus datos se hará los pasos requeridos para crear el Estudiante*/
    private Doctor DoctortoObject(Element element) throws ParseException {
        Doctor nDoctor = new Doctor();

                nDoctor.setNombre(element.getChildText("nombre"));
                nDoctor.setApellido(element.getChildText("apellido"));
                nDoctor.setCedula(Integer.parseInt(element.getChildText("cedula")));
                nDoctor.setAnionac(element.getChildText("anionac"));
                nDoctor.setLocalidad(element.getChildText("localidad"));
                nDoctor.setTelefono(element.getChildText("telefono"));
                nDoctor.setDireccion(element.getChildText("direccion"));
                nDoctor.setNumerocolegitura(element.getChildText("numerocolegiatura"));
                nDoctor.setUniversidadegreso(element.getChildText("universidadegreso"));
                nDoctor.setEstudioespeciales(element.getChildText("estudioespeciales"));
                nDoctor.setEspecialidad(element.getChildText("especialidad"));
                nDoctor.setAnioexperiencia(Integer.parseInt(element.getChildText("anioExperiencia")));
                nDoctor.setDisponible(element.getChildText("disponible"));
                nDoctor.setHoraentrada(element.getChildText("horaentrada"));
                nDoctor.setHorasalida(element.getChildText("horasalida"));
                nDoctor.setInfraestructura(element.getChildText("infraestructura"));
                

        return nDoctor;
    }


    private boolean updateDocument() {
        try {
            XMLOutputter out = new XMLOutputter(org.jdom.output.Format.getPrettyFormat());
            FileOutputStream file = new FileOutputStream(fileLocation);
            out.output(root, file);
            file.flush();
            file.close();
            return true;
        } catch (Exception e) {
            System.out.println("error: " + e.getMessage());
            return false;
        }
    }

    public static Element buscar(List raiz, String dato) {
        Iterator i = raiz.iterator();
        while (i.hasNext()) {
            Element e = (Element) i.next();
        if (dato.equals(e.getChild("cedula").getText())) {
                return e;
            }
        }
        return null;
    }

    public boolean agregarDoctor(Doctor nDoctor) {
        boolean resultado = false;
        root.addContent(DoctortoXmlElement(nDoctor));
        resultado = updateDocument();
        return resultado;
    }

    

    public Doctor buscarDoctor(Integer cedula) {
        Element aux = new Element("doctor");
        List Doctores = this.root.getChildren("doctor");
        while (aux != null) {
            aux = DoctorXml.buscar(Doctores, Integer.toString(cedula));
            if (aux != null) {
                try {
                    return DoctortoObject(aux);
                } catch (ParseException ex) {
                    System.out.println(ex.getMessage());
                }
            }
        }
        return null;
    }

    public boolean actualizarDoctor(Doctor nDoctor) {
        boolean resultado = false;
        Element aux = new Element("doctor");
        List Doctores = this.root.getChildren("doctor");
        while (aux != null) {
            aux = DoctorXml.buscar(Doctores, Integer.toString(nDoctor.getCedula()));
            if (aux != null) {
                Doctores.remove(aux);
                resultado = updateDocument();
            }
        }
        agregarDoctor(nDoctor);
        return resultado;
    }

    /* @param cedula cedula del Estudiante a borrar
     * @return valor boleano con la condicion de exito  */
    public boolean borrarDoctor(Integer cedula) {
        boolean resultado = false;
        Element aux = new Element("doctor");
        List Doctores = this.root.getChildren("doctor");
        while (aux != null) {
            aux = DoctorXml.buscar(Doctores, String.valueOf(cedula));
            if (aux != null) {
                Doctores.remove(aux);
                resultado = updateDocument();
            }
        }
        return resultado;
    }


    /* Para obtener todos los Estudiantes
     * @return ArrayList con todos los objetos Estudiante  */
    public ArrayList<Doctor> todoslosdoctores() {
        ArrayList<Doctor> resultado = new ArrayList<Doctor>();
        for (Object it : root.getChildren()) {
            Element xmlElem = (Element) it;
            try {
                resultado.add(DoctortoObject(xmlElem));
            } catch (ParseException ex) {
                System.out.println(ex.getMessage());
            }
        }
        return resultado;
    }
}
